let fs = require('fs');
const path = require('path');
const resolve = (filename) => {
  return path.resolve(__dirname, filename);
};

const WriteStream = require('./WriteStream');
const ws = new WriteStream(resolve('b.txt'), {
// const ws = fs.createWriteStream(resolve('b.txt'), {
  flags: 'w'
  , encoding: 'utf8' //←默认
  , mode: 0o666 //←默认
  , autoClose: true
  , start: 0
  // , highWaterMark: 16 * 1024 //←默认
  , highWaterMark: 4
});

/*
let flag = ws.write('123', function () {
  console.log('写入成功');
}); //支持string / buffer 不支持数字
console.log('flag:',flag); //true  表示还没有达到highWaterMark 还可以继续写入
*/

//第一次调用write，不论写入的字节数是否大于highWaterMark，都会直接调用fs.write写入
//在写入期间会将writing置为true，这样后面再调用的write就会将要写入的作为chunk存起来
//直到将所有要写入的(包括存起来的那些)，写入完毕后才会将writing置为false，并会触发drain
/*
let flag = ws.write('1234', function () {
  console.log('写入成功');
});
console.log('flag:',flag);
*/




/*
调用ws.write是同步的，但真正写入是异步的
下面多次调用 多的会按顺序存起来 故写入不会乱序

但需要注意的是 这样多次调用write 如果超过了highWaterMark
虽然不会丢失写入数据
但这样会占用多余的内存，和我们的初衷相违背(参考10fs 00一次性读取写入.js和01按字节读取写入.js)

so这个时候就需要依靠flag了
*/
/*let flag = ws.write('123456', function () {
  console.log('写入成功');
}); //支持string / buffer 不支持数字
console.log('flag:',flag);

flag = ws.write('123456', function () {
  console.log('写入成功');
}); //支持string / buffer 不支持数字
console.log('flag:',flag);

flag = ws.write('123456', function () {
  console.log('写入成功');
}); //支持string / buffer 不支持数字
console.log('flag:',flag);
*/





/*
ws.end('ok'); //调用end 后 就不再能调用ws.write了
ws.write('123'); //Error [ERR_STREAM_WRITE_AFTER_END]: write after end
*/



//--- --- ---
/*let i = 9;
while (i>=0) {
  let flag = ws.write(i-- + '');
  console.log(flag);
}*/

let i = 9;
function write(){
  let flag = true;
  while (i>=0&&flag) {
    flag = ws.write(i-- + '');
    console.log('flag:',flag);
  }
}

write();
//只有当攒存的数据大于等于 hightWaterMark 且 缓存的数据被清空时，才会触发 drain 事件
ws.on('drain', () => {
  console.log('drain'); //触发两次
  write();
});
